package com.yunhe.abnormal.service.base;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.yunhe.common.exception.ArgumentErrorException;
import com.yunhe.common.exception.ObjectNotFoundException;
import com.yunhe.common.exception.UniqueConstraintsException;
import com.yunhe.common.model.PageParam;
import com.yunhe.common.model.base.AlarmRuleDTO;

import java.util.List;
import java.util.Optional;

/**
 * 异常规则Service
 * @author liuronglei
 */
public interface AlarmRuleService {

    /**
     * 新增异常规则对象
     * @param alarmRule 异常规则对象
     */
    AlarmRuleDTO create(AlarmRuleDTO alarmRule) throws ArgumentErrorException, ObjectNotFoundException, UniqueConstraintsException;

    /**
     * 批量新增异常规则对象
     * @param alarmRules 异常规则对象列表
     */
    List<AlarmRuleDTO> create(List<AlarmRuleDTO> alarmRules) throws ArgumentErrorException, ObjectNotFoundException, UniqueConstraintsException;

    /**
     * 根据ID获得异常规则对象
     * @param id 对象ID
     */
    AlarmRuleDTO findById(Long id);

    /**
     * 根据ID删除异常规则对象
     * @param id 对象ID
     */
    void deleteById(Long id) throws ObjectNotFoundException;

    /**
     * 根据ID列表批量删除异常规则对象
     * @param ids 对象ID列表
     */
    void batchDelete(List<Long> ids) throws ObjectNotFoundException;

    /**
     * 批量更新异常规则级别
     * @param ids 异常规则ID
     * @param alarmLevelId 异常级别ID
     */
    void updateAlarmLevel(List<Long> ids, Long alarmLevelId);

    /**
     * 更新异常规则对象
     * @param alarmRule 异常规则
     */
    AlarmRuleDTO update(AlarmRuleDTO alarmRule) throws ArgumentErrorException, ObjectNotFoundException, UniqueConstraintsException;

    /**
     * 根据条件获得异常规则对象
     * @param queryStr 关键字
     * @param stationTypeId 电站类型ID
     * @param stationId 电站ID
     * @param alarmLevelId 异常级别ID
     * @param deviceTypeId 设备类型ID
     * @param alarmTypeId 异常类型ID
     * @param alarmScopeId 作用范围ID
     * @param dtime 维护时间
     * @param pageParam 分页对象
     */
    Iterable<AlarmRuleDTO> search(String queryStr,
                                  List<Long> stationTypeId,
                                  List<Long> stationId,
                                  List<Long> alarmLevelId,
                                  List<Long> deviceTypeId,
                                  List<Long> alarmTypeId,
                                  Long alarmScopeId,
                                  List<String> dtime,
                                  PageParam pageParam);

    /**
     * 公式检查
     * @param formula 公式
     */
    boolean formulaCheck(String formula) throws ArgumentErrorException;

    /**
     * 获得电站的异常规则列表
     * @param stationId 电站ID
     */
    List<AlarmRuleDTO> findAlarmRuleForStation(Long stationId);

    /**
     * 获得设备的异常规则列表
     * @param deviceId 设备ID
     */
    List<AlarmRuleDTO> findAlarmRuleForDevice(Long deviceId);

    boolean sendAlarmRulesToDpu(Optional<Long> stationId, Optional<List<Long>> alarmRuleInstanceIds) throws JsonProcessingException, ArgumentErrorException;
}
